gdkkeys: Add support to _get_scroll_lock_state()
authorFabiano Fidêncio <fidencio@redhat.com>
Tue, 14 Apr 2015 11:25:38 +0000 (13:25 +0200)
committerFabiano Fidêncio <fidencio@redhat.com>
Mon, 27 Apr 2015 23:07:52 +0000 (20:07 -0300)
GdkKeymap already has support for _get_num_lock_state() and
_get_caps_lock_state(). Adding _get_scroll_lock_state() would be good
for completness and some backends (Windows?) could take advantage of
this.

docs/reference/gdk/gdk3-sections.txt
gdk/broadway/gdkkeys-broadway.c
gdk/gdkkeys.c
gdk/gdkkeys.h
gdk/gdkkeysprivate.h
gdk/mir/gdkmirkeymap.c
gdk/quartz/gdkkeys-quartz.c
gdk/wayland/gdkkeys-wayland.c
gdk/win32/gdkkeys-win32.c
gdk/x11/gdkkeys-x11.c

index 8ef5d402aab0a0b6aa671905d597678030ddeec1..defd136f4bfa6919ef604fe6a8e5d22b4a93464e 100644 (file)
@@ -668,6 +668,7 @@ gdk_keymap_get_direction
 gdk_keymap_have_bidi_layouts
 gdk_keymap_get_caps_lock_state
 gdk_keymap_get_num_lock_state
+gdk_keymap_get_scroll_lock_state
 gdk_keymap_get_modifier_state
 gdk_keymap_add_virtual_modifiers
 gdk_keymap_map_virtual_modifiers
index c52d1bbb591830266eb84d686347f94681b40fe8..47a16a54d1bdc93fc8dac72ad6f8de2f27db80c8 100644 (file)
@@ -115,6 +115,12 @@ gdk_broadway_keymap_get_num_lock_state (GdkKeymap *keymap)
   return FALSE;
 }
 
+static gboolean
+gdk_broadway_keymap_get_scroll_lock_state (GdkKeymap *keymap)
+{
+  return FALSE;
+}
+
 static gboolean
 gdk_broadway_keymap_get_entries_for_keyval (GdkKeymap     *keymap,
                                            guint          keyval,
@@ -206,6 +212,7 @@ gdk_broadway_keymap_class_init (GdkBroadwayKeymapClass *klass)
   keymap_class->have_bidi_layouts = gdk_broadway_keymap_have_bidi_layouts;
   keymap_class->get_caps_lock_state = gdk_broadway_keymap_get_caps_lock_state;
   keymap_class->get_num_lock_state = gdk_broadway_keymap_get_num_lock_state;
+  keymap_class->get_scroll_lock_state = gdk_broadway_keymap_get_scroll_lock_state;
   keymap_class->get_entries_for_keyval = gdk_broadway_keymap_get_entries_for_keyval;
   keymap_class->get_entries_for_keycode = gdk_broadway_keymap_get_entries_for_keycode;
   keymap_class->lookup_key = gdk_broadway_keymap_lookup_key;
index 63303dce8419f8f8a572e30a789742eca957c9c8..c651205f7a01f833318f51d889d24f560ae365b1 100644 (file)
@@ -357,6 +357,24 @@ gdk_keymap_get_num_lock_state (GdkKeymap *keymap)
   return GDK_KEYMAP_GET_CLASS (keymap)->get_num_lock_state (keymap);
 }
 
+/**
+ * gdk_keymap_get_scroll_lock_state:
+ * @keymap: a #GdkKeymap
+ *
+ * Returns whether the Scroll Lock modifer is locked.
+ *
+ * Returns: %TRUE if Scroll Lock is on
+ *
+ * Since: 3.18
+ */
+gboolean
+gdk_keymap_get_scroll_lock_state (GdkKeymap *keymap)
+{
+  g_return_val_if_fail (GDK_IS_KEYMAP (keymap), FALSE);
+
+  return GDK_KEYMAP_GET_CLASS (keymap)->get_scroll_lock_state (keymap);
+}
+
 /**
  * gdk_keymap_get_modifier_state:
  * @keymap: a #GdkKeymap
index 9749467a907ead7375ce862aabf085b109dbce74..329ce1e88215dd43450ab92bf7101f4ae4c8e032 100644 (file)
@@ -117,6 +117,8 @@ GDK_AVAILABLE_IN_ALL
 gboolean       gdk_keymap_get_caps_lock_state      (GdkKeymap           *keymap);
 GDK_AVAILABLE_IN_ALL
 gboolean       gdk_keymap_get_num_lock_state       (GdkKeymap           *keymap);
+GDK_AVAILABLE_IN_3_18
+gboolean       gdk_keymap_get_scroll_lock_state    (GdkKeymap           *keymap);
 GDK_AVAILABLE_IN_3_4
 guint          gdk_keymap_get_modifier_state       (GdkKeymap           *keymap);
 GDK_AVAILABLE_IN_ALL
index f1c8c1627a6c574a56e914c0a3efd0b942dd5cce..96f67b1519f132d0bacfe49dea24f088a2316897 100644 (file)
@@ -36,6 +36,7 @@ struct _GdkKeymapClass
   gboolean (* have_bidi_layouts)        (GdkKeymap *keymap);
   gboolean (* get_caps_lock_state)      (GdkKeymap *keymap);
   gboolean (* get_num_lock_state)       (GdkKeymap *keymap);
+  gboolean (* get_scroll_lock_state)    (GdkKeymap *keymap);
   gboolean (* get_entries_for_keyval)   (GdkKeymap     *keymap,
                                          guint          keyval,
                                          GdkKeymapKey **keys,
index 82f0d2cf7954e40d5be9d6c8453d059cb48ee3ee..88901240e22127e33ac9fe63c36143a5fed36f56 100644 (file)
@@ -98,6 +98,13 @@ gdk_mir_keymap_get_num_lock_state (GdkKeymap *keymap)
   return xkb_state_led_name_is_active (GDK_MIR_KEYMAP (keymap)->xkb_state, XKB_LED_NAME_NUM);
 }
 
+static gboolean
+gdk_mir_keymap_get_scroll_lock_state (GdkKeymap *keymap)
+{
+  //g_printerr ("gdk_mir_keymap_get_scroll_lock_state\n");
+  return xkb_state_led_name_is_active (GDK_MIR_KEYMAP (keymap)->xkb_state, XKB_LED_NAME_SCROLL);
+}
+
 static gboolean
 gdk_mir_keymap_get_entries_for_keyval (GdkKeymap     *keymap,
                                        guint          keyval,
@@ -470,6 +477,7 @@ gdk_mir_keymap_class_init (GdkMirKeymapClass *klass)
   keymap_class->have_bidi_layouts = gdk_mir_keymap_have_bidi_layouts;
   keymap_class->get_caps_lock_state = gdk_mir_keymap_get_caps_lock_state;
   keymap_class->get_num_lock_state = gdk_mir_keymap_get_num_lock_state;
+  keymap_class->get_scroll_lock_state = gdk_mir_keymap_get_scroll_lock_state;
   keymap_class->get_entries_for_keyval = gdk_mir_keymap_get_entries_for_keyval;
   keymap_class->get_entries_for_keycode = gdk_mir_keymap_get_entries_for_keycode;
   keymap_class->lookup_key = gdk_mir_keymap_lookup_key;
index d2b51105a1b31a07371f448757c03e67ebe6860c..b2a52ed9f038bb4b009b42875b63f2e8f3ecd67a 100644 (file)
@@ -523,6 +523,13 @@ gdk_quartz_keymap_get_num_lock_state (GdkKeymap *keymap)
   return FALSE;
 }
 
+static gboolean
+gdk_quartz_keymap_get_scroll_lock_state (GdkKeymap *keymap)
+{
+  /* FIXME: Implement this. */
+  return FALSE;
+}
+
 static gboolean
 gdk_quartz_keymap_get_entries_for_keyval (GdkKeymap     *keymap,
                                           guint          keyval,
@@ -864,6 +871,7 @@ gdk_quartz_keymap_class_init (GdkQuartzKeymapClass *klass)
   keymap_class->have_bidi_layouts = gdk_quartz_keymap_have_bidi_layouts;
   keymap_class->get_caps_lock_state = gdk_quartz_keymap_get_caps_lock_state;
   keymap_class->get_num_lock_state = gdk_quartz_keymap_get_num_lock_state;
+  keymap_class->get_scroll_lock_state = gdk_quartz_keymap_get_scroll_lock_state;
   keymap_class->get_entries_for_keyval = gdk_quartz_keymap_get_entries_for_keyval;
   keymap_class->get_entries_for_keycode = gdk_quartz_keymap_get_entries_for_keycode;
   keymap_class->lookup_key = gdk_quartz_keymap_lookup_key;
index 814ef342767021888a58bfa832781d60458bb76a..a0cc1f6144721420c1ef6974440f946f5b9f440c 100644 (file)
@@ -117,6 +117,13 @@ gdk_wayland_keymap_get_num_lock_state (GdkKeymap *keymap)
                                        XKB_LED_NAME_NUM);
 }
 
+static gboolean
+gdk_wayland_keymap_get_scroll_lock_state (GdkKeymap *keymap)
+{
+  return xkb_state_led_name_is_active (GDK_WAYLAND_KEYMAP (keymap)->xkb_state,
+                                       XKB_LED_NAME_SCROLL);
+}
+
 static gboolean
 gdk_wayland_keymap_get_entries_for_keyval (GdkKeymap     *keymap,
                                           guint          keyval,
@@ -373,6 +380,7 @@ _gdk_wayland_keymap_class_init (GdkWaylandKeymapClass *klass)
   keymap_class->have_bidi_layouts = gdk_wayland_keymap_have_bidi_layouts;
   keymap_class->get_caps_lock_state = gdk_wayland_keymap_get_caps_lock_state;
   keymap_class->get_num_lock_state = gdk_wayland_keymap_get_num_lock_state;
+  keymap_class->get_scroll_lock_state = gdk_wayland_keymap_get_scroll_lock_state;
   keymap_class->get_entries_for_keyval = gdk_wayland_keymap_get_entries_for_keyval;
   keymap_class->get_entries_for_keycode = gdk_wayland_keymap_get_entries_for_keycode;
   keymap_class->lookup_key = gdk_wayland_keymap_lookup_key;
index fe9c05c409f09a7942fe831b10308d2e5589a432..46c472e0342a5e492259980ea82bbc655df8ef62 100644 (file)
@@ -563,6 +563,12 @@ gdk_win32_keymap_get_num_lock_state (GdkKeymap *keymap)
   return ((GetKeyState (VK_NUMLOCK) & 1) != 0);
 }
 
+static gboolean
+gdk_win32_keymap_get_scroll_lock_state (GdkKeymap *keymap)
+{
+  return ((GetKeyState (VK_SCROLL) & 1) != 0);
+}
+
 static gboolean
 gdk_win32_keymap_get_entries_for_keyval (GdkKeymap     *keymap,
                                    guint          keyval,
@@ -930,6 +936,7 @@ gdk_win32_keymap_class_init (GdkWin32KeymapClass *klass)
   keymap_class->have_bidi_layouts = gdk_win32_keymap_have_bidi_layouts;
   keymap_class->get_caps_lock_state = gdk_win32_keymap_get_caps_lock_state;
   keymap_class->get_num_lock_state = gdk_win32_keymap_get_num_lock_state;
+  keymap_class->get_scroll_lock_state = gdk_win32_keymap_get_scroll_lock_state;
   keymap_class->get_entries_for_keyval = gdk_win32_keymap_get_entries_for_keyval;
   keymap_class->get_entries_for_keycode = gdk_win32_keymap_get_entries_for_keycode;
   keymap_class->lookup_key = gdk_win32_keymap_lookup_key;
index 25df963f62e693bfb00017bc54870fc9c201ce91..90284bd90771a577d7096d80bf1ac93bcbcac36e 100644 (file)
@@ -69,12 +69,14 @@ struct _GdkX11Keymap
   guint lock_keysym;
   GdkModifierType group_switch_mask;
   GdkModifierType num_lock_mask;
+  GdkModifierType scroll_lock_mask;
   GdkModifierType modmap[8];
   PangoDirection current_direction;
-  guint have_direction  : 1;
-  guint have_lock_state : 1;
-  guint caps_lock_state : 1;
-  guint num_lock_state  : 1;
+  guint have_direction    : 1;
+  guint have_lock_state   : 1;
+  guint caps_lock_state   : 1;
+  guint num_lock_state    : 1;
+  guint scroll_lock_state : 1;
   guint modifier_state;
   guint current_serial;
 
@@ -113,6 +115,7 @@ gdk_x11_keymap_init (GdkX11Keymap *keymap)
   keymap->mod_keymap = NULL;
 
   keymap->num_lock_mask = 0;
+  keymap->scroll_lock_mask = 0;
   keymap->group_switch_mask = 0;
   keymap->lock_keysym = GDK_KEY_Caps_Lock;
   keymap->have_direction = FALSE;
@@ -231,6 +234,10 @@ get_xkb (GdkX11Keymap *keymap_x11)
   if (keymap_x11->num_lock_mask == 0)
     keymap_x11->num_lock_mask = XkbKeysymToModifiers (KEYMAP_XDISPLAY (GDK_KEYMAP (keymap_x11)), GDK_KEY_Num_Lock);
 
+  if (keymap_x11->scroll_lock_mask == 0)
+    keymap_x11->scroll_lock_mask = XkbKeysymToModifiers (KEYMAP_XDISPLAY (GDK_KEYMAP (keymap_x11)), GDK_KEY_Scroll_Lock);
+
+
   return keymap_x11->xkb_desc;
 }
 #endif /* HAVE_XKB */
@@ -353,6 +360,7 @@ update_keymaps (GdkX11Keymap *keymap_x11)
       keymap_x11->lock_keysym = GDK_KEY_VoidSymbol;
       keymap_x11->group_switch_mask = 0;
       keymap_x11->num_lock_mask = 0;
+      keymap_x11->scroll_lock_mask = 0;
 
       for (i = 0; i < 8; i++)
         keymap_x11->modmap[i] = 1 << i;
@@ -426,7 +434,7 @@ update_keymaps (GdkX11Keymap *keymap_x11)
               break;
 
             default:
-              /* Find the Mode_Switch and Num_Lock modifiers. */
+              /* Find the Mode_Switch, Num_Lock and Scroll_Lock modifiers. */
               for (j = 0; j < keymap_x11->keysyms_per_keycode; j++)
                 {
                   if (syms[j] == GDK_KEY_Mode_switch)
@@ -439,6 +447,11 @@ update_keymaps (GdkX11Keymap *keymap_x11)
                       /* This modifier is used for Num_Lock */
                       keymap_x11->num_lock_mask |= mask;
                     }
+                  else if (syms[j] == GDK_KEY_Scroll_Lock)
+                    {
+                      /* This modifier is used for Scroll_Lock */
+                      keymap_x11->scroll_lock_mask |= mask;
+                    }
                 }
               break;
             }
@@ -594,6 +607,7 @@ update_lock_state (GdkX11Keymap *keymap_x11,
   gboolean have_lock_state;
   gboolean caps_lock_state;
   gboolean num_lock_state;
+  gboolean scroll_lock_state;
   guint modifier_state;
 
   /* ensure keymap_x11->num_lock_mask is initialized */
@@ -602,17 +616,20 @@ update_lock_state (GdkX11Keymap *keymap_x11,
   have_lock_state = keymap_x11->have_lock_state;
   caps_lock_state = keymap_x11->caps_lock_state;
   num_lock_state = keymap_x11->num_lock_state;
+  scroll_lock_state = keymap_x11->scroll_lock_state;
   modifier_state = keymap_x11->modifier_state;
 
   keymap_x11->have_lock_state = TRUE;
   keymap_x11->caps_lock_state = (locked_mods & GDK_LOCK_MASK) != 0;
   keymap_x11->num_lock_state = (locked_mods & keymap_x11->num_lock_mask) != 0;
+  keymap_x11->scroll_lock_state = (locked_mods & keymap_x11->scroll_lock_mask) != 0;
   /* FIXME: sanitize this */
   keymap_x11->modifier_state = (guint)effective_mods;
 
   return !have_lock_state
          || (caps_lock_state != keymap_x11->caps_lock_state)
          || (num_lock_state != keymap_x11->num_lock_state)
+         || (scroll_lock_state != keymap_x11->scroll_lock_state)
          || (modifier_state != keymap_x11->modifier_state);
 }
 
@@ -747,6 +764,16 @@ gdk_x11_keymap_get_num_lock_state (GdkKeymap *keymap)
   return keymap_x11->num_lock_state;
 }
 
+static gboolean
+gdk_x11_keymap_get_scroll_lock_state (GdkKeymap *keymap)
+{
+  GdkX11Keymap *keymap_x11 = GDK_X11_KEYMAP (keymap);
+
+  ensure_lock_state (keymap);
+
+  return keymap_x11->scroll_lock_state;
+}
+
 static guint
 gdk_x11_keymap_get_modifier_state (GdkKeymap *keymap)
 {
@@ -1556,6 +1583,7 @@ gdk_x11_keymap_class_init (GdkX11KeymapClass *klass)
   keymap_class->have_bidi_layouts = gdk_x11_keymap_have_bidi_layouts;
   keymap_class->get_caps_lock_state = gdk_x11_keymap_get_caps_lock_state;
   keymap_class->get_num_lock_state = gdk_x11_keymap_get_num_lock_state;
+  keymap_class->get_scroll_lock_state = gdk_x11_keymap_get_scroll_lock_state;
   keymap_class->get_modifier_state = gdk_x11_keymap_get_modifier_state;
   keymap_class->get_entries_for_keyval = gdk_x11_keymap_get_entries_for_keyval;
   keymap_class->get_entries_for_keycode = gdk_x11_keymap_get_entries_for_keycode;